// 乐谱编辑器核心工具函数
// 1. 音高点映射
// 2. 录入音符到小节
// 3. 判断是否新建小节
// 4. 判断延音线/下划线
// 5. 竖向叠加音符

/**
 * 根据音高组别返回点数和点位置
 * @param {string} pitchGroup
 * @returns {{dots: number, position: 'above'|'below'|'none'}}
 */
export function getDotInfoByPitchGroup(pitchGroup) {
  const map = {
    '大字二组': { dots: 4, position: 'below' },
    '大字一组': { dots: 3, position: 'below' },
    '大字组': { dots: 2, position: 'below' },
    '小字组': { dots: 1, position: 'below' },
    '小字一组': { dots: 0, position: 'none' },
    '小字二组': { dots: 1, position: 'above' },
    '小字三组': { dots: 2, position: 'above' },
    '小字四组': { dots: 3, position: 'above' },
    '小字五组': { dots: 4, position: 'above' }
  }
  return map[pitchGroup] || { dots: 0, position: 'none' }
}

/**
 * 录入音符到指定小节
 * @param {Object} measure 当前小节对象
 * @param {number} staffIndex 声部索引（0:右手/单声部, 1:左手）
 * @param {Object} note 音符对象
 * @param {number} maxBeats 当前小节最大时值（如4/4为4）
 * @returns {boolean} 是否需要新建小节
 */
export function addNoteToMeasure(measure, staffIndex, note, maxBeats) {
  if (!measure.notes[staffIndex]) {
    measure.notes[staffIndex] = []
  }
  measure.notes[staffIndex].push(note)
  const used = getUsedBeats(measure, staffIndex)
  return used >= maxBeats
}

/**
 * 计算某声部已用时值
 * @param {Object} measure
 * @param {number} staffIndex
 * @returns {number}
 */
export function getUsedBeats(measure, staffIndex) {
  return (measure.notes[staffIndex] || []).reduce((sum, note) => sum + (note.duration || 0), 0)
}

/**
 * 判断时值类型是否需要延音线或下划线
 * @param {number} duration 时值（如1=全音符，0.5=二分音符，0.25=四分音符等）
 * @returns {'tie'|'underline'|null}
 */
export function getNoteLineType(duration) {
  if (duration >= 0.5) return 'tie' // 二分音符及以上用延音线
  if (duration < 0.5) return 'underline' // 四分音符及以下用下划线
  return null
}

/**
 * 给音符竖向叠加新音符
 * @param {Object} note 原音符对象
 * @param {Object} verticalNote 新叠加的音符对象
 */
export function addVerticalNoteToNote(note, verticalNote) {
  if (!note.verticalNotes) note.verticalNotes = []
  note.verticalNotes.push(verticalNote)
}

/**
 * 生成新小节对象
 * @param {number} index 小节编号
 * @param {number} staffCount 声部数（单声部1，双声部2）
 * @returns {Object}
 */
export function createNewMeasure(index, staffCount = 1) {
  return {
    index,
    notes: Array.from({ length: staffCount }, () => [])
  }
} 